#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>

void Usage(char *proc)
{
    printf("Usage: %s,pid signo %d\n", proc, getpid());
}
void catchSing(int signo)
{
    printf("我获取到了一个信号，信号编号是：%d\n", signo);
    signal(SIGFPE, catchSing);
}

int main(int argc, char *argv[])
{

    // 1. 通过终端按键产生信号
    // while (1)
    // {
    //     /* code */
    //     printf("hello world\n");
    //     sleep(1);
    // }

    // 2. 调用系统函数向进程发信号
    // (1)kill() 可以像任意进程发送任意信号
    // if (argc != 3)
    // {
    //     Usage(argv[0]);
    //     exit(1);
    // }
    // pid_t pid = atoi(argv[1]);
    // int signo = atoi(argv[2]);
    // int n = kill(pid, signo);
    // if (n != 0)
    // {
    //     perror("kill");
    // }

    // (2) raise() 给自己发送任意信号
    // int cnt = 0;
    // while (cnt <= 10)
    // {
    //     /* code */
    //     printf("cnt:%d\n", cnt++);
    //     sleep(1);
    //     if (cnt >= 5)
    //         // raise(9);
    //         abort(); // 给自己发送指定的6号信号
    // }

    // 3. 硬件异常产生
    // signal(SIGFPE, catchSing);

    // int a = 10;
    // a /= 0; // 除零操作，会产生 SIGFPE 信号

    // while (1)
    // {
    //     printf("我正在运行中..........\n");
    //     sleep(1);
    //     // 以下代码注释掉了，以避免再次触发 SIGFPE
    //     // int a = 10;
    //     // a /= 0;
    // }

    // 软件条件
    // 统计1S左右，我们计算机能够将数据累计计多少次
    alarm(1);
    int cnt = 0;
    while (1)
    {
        printf("cnt: %d\n", cnt);
        cnt++;
    }
}